package modelo;

import java.util.Collection;
import java.util.ArrayList;
import java.lang.Math;

import modelo.excepciones.EdificioInexistente;

public class BibliotecaDeCiudades {

        private Collection<Ciudad> ciudades;
        private GeneradorDeEdificios generador;


        public BibliotecaDeCiudades(){
                ciudades = new ArrayList<Ciudad>();
                generador = new GeneradorDeEdificios();
        }


        public boolean agregarCiudad(String nombre, double latitudEnDecimal, double longitudEnDecimal, String descripcion, String coloresBandera, String moneda, Collection<String> geografia, Collection<String> referencias, Collection<String> industrias, Collection<String> animales, Collection<String> gente, Collection<String> idiomas, Collection<String> arte, Collection<String> religiones, String gobierno, Collection <String> miscelaneos, String edificio1, String edificio2, String edificio3){
            for(Ciudad ciudad : ciudades){
            	if (ciudad.obtenerNombre().equalsIgnoreCase(nombre)) return false;
            }
            Ciudad ciudad = new Ciudad(nombre, latitudEnDecimal, longitudEnDecimal, descripcion);

            if (!this.crearYAsignarEdificiosALaCiudad(ciudad, edificio1, edificio2, edificio3)) return false;
            
            if (coloresBandera != null){
                    this.crearYAsignarBanderaACiudad(ciudad, coloresBandera);
            }
            if (moneda!= null){
                    this.crearYAsignarMonedaACiudad(ciudad, moneda);
            }
            if (geografia!= null){
                    this.crearYAsignarGeografiasACiudad(ciudad, geografia);
            }
            if (referencias != null){
                    this.crearYAsignarLugaresDeReferenciaACiudad(ciudad, referencias);
            }
            if (industrias != null){
                    this.crearYAsignarIndustriasACiudad(ciudad, industrias);
            }
            if (animales != null){
                    this.crearYAsignarAnimalesACiudad(ciudad, animales);
            }
            if (gente != null){
                    this.crearYAsignarGentesACiudad(ciudad, gente);
            }
            if (idiomas != null){
                    this.crearYAsignarIdiomasACiudad(ciudad, idiomas);
            }
            if (arte != null){
                    this.crearYAsignarArtesACiudad(ciudad, arte);
            }
            if (religiones != null){
                    this.crearYAsignarReligionesACiudad(ciudad, religiones);
            }
            if (gobierno != null){
                    this.crearYAsignarGobiernoACiudad(ciudad, gobierno);
            }
            if (miscelaneos != null){
                    this.crearYAsignarMiscelaneosACiudad(ciudad, miscelaneos);
            }
            
            ciudades.add(ciudad);
            return true;
        }

        private boolean crearYAsignarEdificiosALaCiudad(Ciudad ciudad, String edificio1, String edificio2, String edificio3){
              
        	  ArrayList<String> lista_para_random = new ArrayList<String>();
        	  lista_para_random.add(edificio1);
        	  lista_para_random.add(edificio2);
        	  lista_para_random.add(edificio3);
        	  int numero_random = (int) (Math.random() * 2);
              Collection<Edificio> edificios = new ArrayList<Edificio>();
              try {
              	int i = 0;
              	Edificio edif = null;
              	for (String edificio : lista_para_random){
              		if (i == numero_random) edif = generador.obtenerEdificio(edificio, true);
              		else edif = generador.obtenerEdificio(edificio, false);
              		edificios.add(edif);
              		i++;
              	}
              } catch (EdificioInexistente e) {
                      return false;
              }
              if (!generador.edificiosSonDeDistintaIndole(edificios)){
                  return false;
              }
              for (Edificio edif : edificios){
            	  ciudad.agregarEdificio(edif);
              }
              return true;
        
        
        }

        private void crearYAsignarBanderaACiudad(Ciudad ciudad, String coloresBandera){
                Bandera bandera = new Bandera(coloresBandera);
                ciudad.agregarBandera(bandera);
        }

        private void crearYAsignarMonedaACiudad(Ciudad ciudad, String moneda){
                Moneda mon = new Moneda(moneda);
                ciudad.agregarMoneda(mon);
        }

        private void crearYAsignarGobiernoACiudad(Ciudad ciudad, String gobierno){
                Gobierno gob = new Gobierno(gobierno);
                ciudad.agregarGobierno(gob);
        }

        private void crearYAsignarGeografiasACiudad(Ciudad ciudad, Collection<String> geografias){
                for (String geografia : geografias){
                        Geografia geo = new Geografia(geografia);
                        ciudad.agregarGeografia(geo);
                }
        }


        private void crearYAsignarLugaresDeReferenciaACiudad(Ciudad ciudad, Collection<String> referencias){
                for (String referencia : referencias){
                        LugarDeReferencia ref = new LugarDeReferencia(referencia);
                        ciudad.agregarLugarDeReferencia(ref);
                }
        }


        private void crearYAsignarIndustriasACiudad(Ciudad ciudad, Collection<String> industrias){
                for (String industria : industrias){
                        Industria ind = new Industria(industria);
                        ciudad.agregarIndustria(ind);
                }
        }


        private void crearYAsignarAnimalesACiudad(Ciudad ciudad, Collection<String> animales){
                for (String animal : animales){
                        Animal anim = new Animal(animal);
                        ciudad.agregarAnimal(anim);
                }
        }

        private void crearYAsignarGentesACiudad(Ciudad ciudad, Collection<String> gentes){
                for (String gente : gentes){
                        Gente gent = new Gente(gente);
                        ciudad.agregarGente(gent);
                }
        }

        private void crearYAsignarIdiomasACiudad(Ciudad ciudad, Collection<String> idiomas){
                for (String idioma : idiomas){
                        Idioma idiom = new Idioma(idioma);
                        ciudad.agregarIdioma(idiom);
                }
        }

        private void crearYAsignarArtesACiudad(Ciudad ciudad, Collection<String> artes){
                for (String arte : artes){
                        Arte art = new Arte(arte);
                        ciudad.agregarArte(art);
                }
        }

        private void crearYAsignarReligionesACiudad(Ciudad ciudad, Collection<String> religiones){
                for (String religion : religiones){
                        Religion relig = new Religion(religion);
                        ciudad.agregarReligion(relig);
                }
        }

        private void crearYAsignarMiscelaneosACiudad(Ciudad ciudad, Collection<String> miscelaneos){
                for (String miscelaneo : miscelaneos){
                        Miscelaneo misc = new Miscelaneo(miscelaneo);
                        ciudad.agregarMiscelaneo(misc);
                }
        }

        public Ciudad obtenerCiudad(String nombre){
            for (Ciudad ciudad: ciudades){
            	if (ciudad.obtenerNombre().equalsIgnoreCase(nombre)) return ciudad;
            }            
            return null;
        }

        public Ciudad obtenerCiudadAleatoria(){
                if (ciudades.size() == 0){
                        return null;
                }
                return ((ArrayList<Ciudad>) ciudades).get((int) (Math.random() * ciudades.size()));
        }

}
